﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FimetContoDeposito.DAL;
using GrayParrot.Core;

namespace FimetContoDeposito.BLL.Facades
{
    public class AnagraficaDocumentiFacade : FacadeBase<AnagraficaDocumentiFacade>
    {
        FCDContext m_ctx = null;

        public Repository<FCD_AnagraficaDocumenti, Guid> Repo { get; internal set; }


        public AnagraficaDocumentiFacade()
        {
        }

        public override void Initialize()
        {
            m_ctx = new FCDContext();
            m_ctx.Configuration.LazyLoadingEnabled = false;
            m_ctx.Configuration.ProxyCreationEnabled = false;

            Repo = this.GetRepository<FCD_AnagraficaDocumenti, Guid>(m_ctx);
        }

        public override void Dispose()
        {
            if (m_ctx != null)
            {
                m_ctx.Dispose();

                Repo.Dispose();
            }
        }

        public ReturnValue<bool> Add(FCD_AnagraficaDocumenti item)
        {
            ReturnValue<bool> retValue = new ReturnValue<bool>();

            try
            {
                if (item.Id == Guid.Empty)
                {
                    item.Id = Guid.NewGuid();
                }

                this.Repo.Add(item);
                this.Repo.Save();

                retValue.HasValue = true;
                retValue.Value = true;
            }
            catch (Exception ex)
            {
                retValue.HasError = true;
                retValue.Error = ex;
            }

            return retValue;
        }

        public ReturnValue<bool> Edit(FCD_AnagraficaDocumenti item)
        {
            ReturnValue<bool> retValue = new ReturnValue<bool>();

            try
            {
                this.Repo.Edit(item);
                this.Repo.Save();

                retValue.HasValue = true;
                retValue.Value = true;
            }
            catch (Exception ex)
            {
                retValue.HasError = true;
                retValue.Error = ex;
            }

            return retValue;
        }

        public ReturnValue<bool> Delete(FCD_AnagraficaDocumenti item)
        {
            ReturnValue<bool> retValue = new ReturnValue<bool>();

            try
            {
                this.Repo.Delete(item);
                this.Repo.Save();

                retValue.HasValue = true;
                retValue.Value = true;
            }
            catch (Exception ex)
            {
                retValue.HasError = true;
                retValue.Error = ex;
            }

            return retValue;
        }

        public ReturnValue<FCD_AnagraficaDocumenti> Get(Guid id)
        {
            ReturnValue<FCD_AnagraficaDocumenti> retValue = new ReturnValue<FCD_AnagraficaDocumenti>();

            try
            {
                retValue.Value = this.Repo.Get(id);
                retValue.HasValue = true;
            }
            catch (Exception ex)
            {
                retValue.HasError = true;
                retValue.Error = ex;
            }

            return retValue;
        }

        public ReturnValue<IQueryable<FCD_AnagraficaDocumenti>> GetAll()
        {
            ReturnValue<IQueryable<FCD_AnagraficaDocumenti>> retValue = new ReturnValue<IQueryable<FCD_AnagraficaDocumenti>>();
            retValue.HasValue = false;
            retValue.Value = null;

            try
            {
                retValue.Value = this.Repo.GetAll();
                retValue.HasValue = true;
            }
            catch (Exception ex)
            {
                retValue.HasError = true;
                retValue.Error = ex;
            }

            return retValue;
        }

        /// <summary>
        /// Salva lo specifico documento di anagrafica movimento...
        /// </summary>
        /// <param name="anagraficaDocumento">The anagrafica documento.</param>
        /// <returns></returns>
        public ReturnValue<bool> Salva(FCD_AnagraficaDocumenti anagraficaDocumento)
        {
            ReturnValue<bool> retValue = new ReturnValue<bool>(false);
            retValue.HasValue = false;

            ReturnValue<FCD_AnagraficaDocumenti> m_res = this.Get(anagraficaDocumento.Id);

            string m_msg = string.Empty;
            if (m_res.HasValue && m_res.Value != null)
            {
                m_res.Value.Customer = anagraficaDocumento.Customer;
                m_res.Value.DataDocumento = anagraficaDocumento.DataDocumento;
                m_res.Value.NumeroDocumento = anagraficaDocumento.NumeroDocumento;
                m_res.Value.TipoDocumento = anagraficaDocumento.TipoDocumento;

                m_ctx.SaveChanges();

                retValue.Message = "Anagrafica Documento aggiornato.";
                retValue.Value = true;
                retValue.HasValue = true;
            }
            else
            {
                if (m_res.HasError)
                {
                    retValue.Message = m_res.Error.Message;
                    retValue.HasError = true;
                }
                else
                {
                    retValue.Message = m_res.Message;
                    retValue.HasValue = true;
                    retValue.Value = false;
                }
            }

            return retValue;
        }
    }
}
